#ifndef __UART_TCP_H__
#define __UART_TCP_H__

#include <stdio.h> 
#include <stm32f10x.h>
#include "defined.h"
//========================TCP通信===================================
#define	 	TCP_ADDR_COMM				0x02//TCP通信地址
#define 	RCV_TCP_BUF_SIZE  	50//接收缓冲大小
#define 	Rv_Rd_TCP_LEGTH			8	//读帧长度
#define  	Rv_Wd_TCP_LEGTH			(8+2)  //TCP写帧长度 1+1+2+2+2+2
#define  	Tx_Wd_TCP_LEGTH			 8//发送应答写帧长度
#define  	Tx_Re_TCP_LEGTH			(4+TCP_MAX_POST*2)//发送post长度 1+1+TCP_MAX_POST*2+2
//#define  	ERR_TCP_LEGTH			  5//错误帧长度1+1+1+1+2

//-------指令信息
#define	 		TCP_READ_COMM			0x04//读状态
#define			TCP_WRITE_COMM		0x10//写操作命令
#define			TCP_MAX_POST			0x05//最大状态表
#define	 		RE_ERR_TCP_READ_COMM		0x84//读状态错误应答
#define			RE_ERR_TCP_WRITE_COMM		0x90//写操作命令错误应答



typedef enum
{
	RE_TCP_NULL=0,			//未接收
	RE_TCP_NORMAL=0xFF,//正确需解析
	RE_TCP_ERR=0x01,//通用错误-通讯地址或功能码不对
	RE_TCP_ADDR_ERR=0x02,//地址溢出
	RE_TCP_LENGH_ERR=0x03,//长度不对	
	RE_TCP_DATA_ERR=0x04,//数据不对	
	RE_TCP_CRC16_ERR=0x05,//crc异常帧		
	RE_TCP_TIME_OUT=0x06, //接收超时
	RE_TCP_CONN=0x07,  //粘包
}RE_TCP_TYPE;


//--------------------指令结构-----------------
//接收TCP读帧    0x04
typedef struct	
{
		u8				Addr;				//通信地址默认0x02
		u8				Func;				//命令功能码
		afantiU		Start_Addr;	//抄读的起始地址
		afantiU		Number;			//参数字节数		
		afantiU		Crc16;			//crc16校验码
}TCP_READ_STR;

//接收TCP操作帧		0x10
typedef struct	
{
		u8				Addr;				//通信地址默认0x02
		u8				Func;				//命令功能码
		afantiU		C_Addr;			//指令地址
		afantiU		C_Num;			//指令长度
		afantiU		C_Data;			//参数  
		afantiU		Crc16;			//crc16校验码
}TCP_CTL_STR;

//正常写命令成功响应0x10
typedef struct	
{
		u8				Addr;			//通信地址默认0x02
		u8				Func;			//命令功能码
		afantiU		C_Addr;		//指令地址
		afantiU		C_Data;	//指令字节数	
		afantiU		Crc16;		//crc16校验码
}TCP_CTL_SUCCESS_STR;

//正常读成功上传状态0x04
typedef struct	
{
		u8				Addr;			//通信地址默认0x02
		u8				Func;			//命令功能码	
		afantiU		Data[TCP_MAX_POST];		//参数表指针   
		afantiU		Crc16;		//crc16校验码
}TCP_CTL_POST_STR;

//异常失败响应--所有指令
typedef struct	
{
		u8			Addr;			//通信地址默认0x02
		u8			Func;			//命令功能码
		u8			type;			//异常类型
		afantiU	Crc16;		//crc16校验码
}TCP_FAILURE_STR;


void UART_TCP_RxEvent(void);
void UART_TCP_TxEvent(void);
unsigned CRC16_result(u8 *puchMsg, u8 uchDataLen);//计算crc16
afantiU BIG2SMALL(afantiU *Crcu16);//modus先传输高位需颠倒
afantiU SMALL2BIG(afantiU *Crcu16);
void Slave_Cmd_Send(USART_TypeDef* USARTx ,u8*CmdStr,u8 length);//从机发送相应
void Slave_afantiU_Send(USART_TypeDef* USARTx ,afantiU* afantiU16);//发送一个afantiU16,低字节在前
void UART_TCP_CTL(u16 addr,u16 data );
void UART_SendByte(USART_TypeDef* USARTx,u16 Data)  ;

#endif



